﻿// 3715. 最少交换次数.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
/*
https://www.acwing.com/problem/content/3718/


给定一个 1∼N的随机排列，要求一次只能交换相邻两个数，那么最少需要交换多少次才可以使数列按照从小到大排列呢？

请你求出一个待排序序列的最少交换次数和对应的逆序数列。

逆序数列：给定 n个数 1,2,…,n的一个排列 a1a2…an
，令 bi 是数 i在此排列中的逆序数，换句话说，bi等于该排列中先于 i又大于 i的那些数的个数。数列 b1b2…bn
 称为排列 a1a2…an的逆序数列(inversion sequence)。

输入格式
第一行一个整数 N。

第二行一个 1∼N 的排列。

输出格式
第一行输出逆序数列，数之间用空格隔开。

第二行输出最少交换次数。

数据范围
1≤N≤1000
输入样例：
8
4 8 1 7 5 6 1 1
输出样例：
6 2 5 0 2 2 1 0
18
*/


#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;


const int N = 1010;
int a[N], b[N];
int n;


int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	memcpy(b, a, sizeof b);
	sort(b, b + n);

	for (int i = 0; i < n; i++) {
		int val = b[i];
		int res = 0;
		for (int i = 0; i < n; i++) {
			if (a[i] > val) { res++; }
			if (a[i] == val) {
				break;
			}
		}
		b[i] = res;
	}
 
	for (int i = 0; i < n; i++) {
		cout << b[i] << " ";
	}

	int res = 0;
	for (int i = 0; i < n; i++) {
		res += b[i];
	}

	cout << endl << res << endl;
	return 0;
}

 